package com.mori.algorithm;

import java.util.stream.IntStream;

/**
 * <p>
 *     水仙花数
 * 水仙花数的定义是，这个数等于他每一位上数的幂次之和
 * 比如一个3位的十进制整数153就是一个水仙花数。因为 153 = 1^3 + 5^3 + 3^3。
 * 而一个4位的十进制数1634也是一个水仙花数，因为 1634 = 1^4 + 6^4 + 3^4 + 4^4。
 * 给出n，找到所有的n位十进制水仙花数。
 * </p>
 *
 * @author mori
 * @since 10/22/2019 2:45 PM
 */
public class NarcissisticNumber {

    public static void main(String[] args) {
        getNarcissisticNumber(0, 10000);
    }

    /**
     * 给出一个范围，找出这个范围所有的水仙花数
     *
     * @param minNumber
     * @param maxNumber
     */
    public static void getNarcissisticNumber(Integer minNumber, Integer maxNumber) {
        IntStream.range(minNumber, maxNumber + 1).forEach(n -> {
            if (isNarcissisticNumber(n)) {
                System.out.println("找到水仙花数:" + n);
            }
        });
    }

    /**
     * 判断是否是水仙花数
     *
     * @param number
     * @return
     */
    public static boolean isNarcissisticNumber(Integer number) {
        // 位数
        int digits = String.valueOf(number).length();
        int temp = number;
        int sum = 0;
        while (temp > 0) {
            sum += Math.pow(temp % 10, digits);
            temp = temp / 10;
        }
        return sum == number;
    }

}
